package de.hdu.pms.ho.dao;

import org.junit.Test;

import de.hdu.pms.ho.model.Arbeitsplan;
import de.hdu.pms.ho.model.Kategorie;
import de.hdu.pms.ho.model.Personal;
import de.hdu.pms.ho.model.Zimmer;

import java.util.List;



/**
 * Testclass to test all methods from {@link ArbeitsplanDao}
 * @author Helena Semmel
 *
 */
public class ArbeitsplanDaoTest extends AbstractDataAccessTest {


	private ArbeitsplanDao arbeitsplanDao;
	private String tableName = "Arbeitsplan";
	public void setArbeitsplanDao(ArbeitsplanDao arbeitsplanDao) {
		this.arbeitsplanDao = arbeitsplanDao;
	}
	private PersonalDao personalDao;
	private ZimmerDao zimmerDao;
	public void setPersonalDao(PersonalDao personalDao) {
		this.personalDao = personalDao;
	}
	public void setZimmerDao(ZimmerDao zimmerDao) {
		this.zimmerDao = zimmerDao;
	}
	private KategorieDao kategorieDao;
		public void setKategorieDao(KategorieDao kategorieDao) {
		this.kategorieDao = kategorieDao;
	}
	@SuppressWarnings("deprecation")
	@Test
	public void testFindById() {
		String[] tables = {tableName};
		deleteFromTables(tables);
		kategorieDao.create("Deluxe", 150);
		List<Kategorie> allKat = kategorieDao.findAll();
		personalDao.create("Leo", "Reinmacher");			
		personalDao.create("Susi", "Putzer");
		List<Personal> allPersonal = personalDao.findAll();
		zimmerDao.create(1, 2, 20, true, false, allKat.get(0));
		zimmerDao.create(2, 4, 30, true, false, allKat.get(0));
		List<Zimmer> alleZimmer = zimmerDao.findAll();
		arbeitsplanDao.create(allPersonal.get(0), alleZimmer.get(0), "01.01.2012", "01.02.2012");
		arbeitsplanDao.create(allPersonal.get(1), alleZimmer.get(1), "01.01.2012", "08.02.2012");
		
		List<Arbeitsplan> allePläne = arbeitsplanDao.findAll();
		for (Arbeitsplan p: allePläne) {
			int id = p.getId();
			Arbeitsplan found = arbeitsplanDao.findById(id);
			assertEquals(p.getZimmer(), found.getZimmer());
		}
		deleteFromTables(tables);
	}
	
	@Test
	public void testFindAll() {
		// already tested by testFindById()
		testFindById();
	}
	
	@SuppressWarnings("deprecation")
	@Test
	public void testCreate() {
		String[] tables = {tableName};
		deleteFromTables(tables);
		kategorieDao.create("Deluxe", 150);
		List<Kategorie> allKat = kategorieDao.findAll();
		personalDao.create("Leo", "Reinmacher");	
		List<Personal> allPersonal = personalDao.findAll();
		zimmerDao.create(1, 2, 20, true, false, allKat.get(0));
		zimmerDao.create(2, 4, 30, true, false, allKat.get(0));
		List<Zimmer> alleZimmer = zimmerDao.findAll();
		arbeitsplanDao.create(allPersonal.get(0), alleZimmer.get(0), "01.01.2012", "01.02.2012");
		int rows = countRowsInTable(tableName);
		assertEquals("Die DB muss eine Zeile enthalten", 1, rows);
	}

	/**
	 * 
	 */
	@SuppressWarnings("deprecation")
	@Test
	public void testModify() {
		String[] tables = {tableName};
		deleteFromTables(tables);
		
		kategorieDao.create("Deluxe", 150);
		List<Kategorie> allKat = kategorieDao.findAll();
		zimmerDao.create(1, 2, 20, true, false, allKat.get(0));
		List<Zimmer> alleZimmer = zimmerDao.findAll();
		personalDao.create("Leo", "Reinmacher");			
		List<Personal> allPersonal = personalDao.findAll();
		arbeitsplanDao.create(allPersonal.get(0), alleZimmer.get(0), "01.01.2012", "01.02.2012");	
		
		sessionFactory.getCurrentSession().clear();
		List<Arbeitsplan> allePläne = arbeitsplanDao.findAll();
		String neuesEnde = "01.03.2012";
		for (Arbeitsplan x : allePläne) {
			int id = x.getId();
			arbeitsplanDao.modify(id, allPersonal.get(0), alleZimmer.get(0), "01.01.2012", neuesEnde);
		}
		allePläne = arbeitsplanDao.findAll();
		Arbeitsplan found = null;
		for (Arbeitsplan x : allePläne) {
			found = x;
		}
		assertEquals(neuesEnde, found.getArbeitsende());
		deleteFromTables(tables);
	}
	
	@SuppressWarnings("deprecation")
	@Test
	public void testDeletebyId() {
		String[] tables = {tableName};
		deleteFromTables(tables);
		kategorieDao.create("Deluxe", 150);
		List<Kategorie> allKat = kategorieDao.findAll();
		zimmerDao.create(1, 2, 20, true, false, allKat.get(0));;
		List<Zimmer> alleZimmer = zimmerDao.findAll();
		personalDao.create("Leo", "Reinmacher");			
		List<Personal> allPersonal = personalDao.findAll();
		arbeitsplanDao.create(allPersonal.get(0), alleZimmer.get(0), "01.01.2012", "01.02.2012");
		sessionFactory.getCurrentSession().flush();
		List<Arbeitsplan> allePläne = arbeitsplanDao.findAll();
		for (Arbeitsplan x : allePläne) {
			int id = x.getId();
			arbeitsplanDao.deletebyId(id);
			sessionFactory.getCurrentSession().flush();
			assertEquals(0, countRowsInTable(tableName));
		}
	}

	
	
}
